package cn.fansunion.leecode.string;

/**
 * 旋转字符串 给定两个字符串, s 和 goal。如果在若干次旋转操作之后，s 能变成 goal ，那么返回 true 。
 * 
 * s 的 旋转操作 就是将 s 最左边的字符移动到最右边。 
 * 
 * 例如, 若 s = 'abcde'，在旋转一次之后结果就是'bcdea' 。
 * 
 * 来源：力扣（LeetCode） 链接：https://leetcode-cn.com/problems/rotate-string 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * 
 * @author wen.lei@brgroup.com
 *
 *         2022-2-16
 */
public class RotateString {
    // 输入: s = "abcde", goal = "cdeab"
    // 输出: true
    public boolean rotateString(String s, String goal) {
        final int length = s.length();
        for (int index = 0; index < length; index++) {
            if (s.equals(goal)) {
                return true;
            } else {
                s = rotateStr(s);
            }
        }
        return false;
    }

    // 比较清晰的代码
    public boolean rotateString2(String s, String goal) {
        if (s.equals(goal)) {
            return true;
        }
        final int length = s.length();
        for (int index = 0; index < length; index++) {
            s = rotateStr(s);
            if (s.equals(goal)) {
                return true;
            }
        }
        return false;
    }

    private String rotateStr(String s) {
        StringBuilder sb = new StringBuilder();
        sb.append(s.subSequence(1, s.length()));
        sb.append(s.charAt(0));
        return sb.toString();
    }

    // 第1次，错误的代码
    public boolean rotateStringError(String s, String goal) {
        final int length = s.length();
        // 本来想优化一次，用“length - 1”，结果边界值情况，单元测试，没测到，尴尬了
        // 为什么呢？index=0遍历，是原地比较，没有rotate
        for (int index = 0; index < length - 1; index++) {
            if (s.equals(goal)) {
                return true;
            } else {
                s = rotateStr(s);
            }
        }
        return false;
    }
    
    //官方，创新解法
    //在写代码的过程中，更加侧重“按照题目的功能和流程”来实现，这种“投机取巧”的解法，一般不会特别去想
    //"蛇咬住自己的尾巴”，头脑中可能有1/10000的瞬间，考虑过类似思路，没细想，习惯标准解法了
    public boolean rotateString5(String A, String B) {
        return A.length() == B.length() && (A + A).contains(B);
    }
}
